﻿using System.Collections.Generic;
using System.Xml.Linq;
using Szabalyrendszer.Modositok;
using Szabalyrendszer.Adatok;
using System;
using System.Linq;

namespace Szabalyrendszer
{
    public class Raktar : IRaktar
    {
        private static IRaktar instancia;
        private static MagusAdatbazisDataSet adatok;

        public static IRaktar Instancia
        {
            get { return instancia ?? (instancia = new Raktar()); }
        }

        public Raktar()
        {
            adatok = new MagusAdatbazisDataSet();
        }

        public List<Fegyverzet> OszesFegyver()
        {
            var fegyerek = new List<Fegyverzet>();

            XElement doc = XElement.Load("Fegyverek.xml");
            IEnumerable<XElement> childList =
                from el in doc.Elements()
                select el;
            
            return fegyerek;
        }

        public List<HarcertekBonusz> OszesHarciHelyzetModosito()
        {
            List<HarcertekBonusz> hmek =
                adatok.Harci_helyzet_modositok.Where(m => !m.HarciCsel).ToList().
                ConvertAll(c => new HarcertekBonusz
                                    {
                                        Ke = c.Ke,
                                        Te = c.Te,
                                        Ve = c.Ve,
                                        Ce = c.Ce,
                                    });
            return hmek;
        }

        //ConvertAll(c => new HarcertekBonusz
        //        {
        //            Ke = c.Ke,
        //            Te = c.Te,
        //            Ve = c.Ve,
        //            Ce = c.Ce,
        //        })

        public Dictionary<Kepzettseg,HarcertekBonusz> OszesHarciCsel()
        {
            var cselek = new Dictionary<Kepzettseg, HarcertekBonusz>();
            var hmek = adatok.Harci_helyzet_modositok.Where(m => m.HarciCsel).ToList().GroupBy(csel => csel.EngedelyezoKepzettseg, csel => csel);

            return cselek;
        }

        public List<Kepzettseg> OszesKepzettseg()
        {
            return new List<Kepzettseg>();
        }

        public List<KarakterLap> OszesKarakterLap()
        {
            return new List<KarakterLap>();
        }

        public OpcionalisSzabalyok OpcionalisSzabalyok()
        {
            return new OpcionalisSzabalyok();
        }

        public List<Idomagia> OszesIdoMagia()
        {
            var idomagiak = new List<Idomagia>();
            foreach (var item in Enum.GetValues(typeof(IdomagiaTipus)).Cast<IdomagiaTipus>().ToList())
            {
                idomagiak.AddRange(IdomagiaTipusSzerint(item));
            }

            return idomagiak;
        }

        public List<Idomagia> IdomagiaTipusSzerint(IdomagiaTipus tipus)
        {
            switch (tipus)
            {
                case IdomagiaTipus.Kor:
                    return Idoszamolas(5, 1, IdomagiaTipus.Kor, 1);
                case IdomagiaTipus.Perc:
                    return Idoszamolas(10, 3, IdomagiaTipus.Perc, 10);
                case IdomagiaTipus.Ora:
                    return Idoszamolas(25, 5, IdomagiaTipus.Ora, 10 * 6);
                case IdomagiaTipus.Nap:
                    return Idoszamolas(50, 7, IdomagiaTipus.Nap, 10 * 6 * 60);
                case IdomagiaTipus.Ev:
                    return Idoszamolas(90, 10, IdomagiaTipus.Ev, 10 * 6 * 60 * 6);
                case IdomagiaTipus.Orokkevalosag:
                    return Idoszamolas(150, 0, IdomagiaTipus.Orokkevalosag, 10 * 6 * 60 * 12);
                default:
                    return new List<Idomagia>();
            }
        }



        private List<Idomagia> Idoszamolas(int kezdetiManna, int megEgyAdaghoz, IdomagiaTipus tipus, int varazslasiIdo)
        {
            List<Idomagia> idok = new List<Idomagia>();

            if (tipus == IdomagiaTipus.Orokkevalosag)
            {
                idok.Add(new Idomagia { Idotartam = Int32.MaxValue, MannaPont = kezdetiManna, Tipus = tipus, VarazslasiIdo = varazslasiIdo });
            }
            else
            {
                for (int i = 0; i < 10; i++)
                {
                    idok.Add(new Idomagia
                    {
                        Idotartam = i,
                        MannaPont = kezdetiManna + i == 0 ? 0 : i * megEgyAdaghoz,
                        Tipus = tipus,
                        VarazslasiIdo = varazslasiIdo
                    });
                }
            }
            return idok;
        }
    }
}
